package br.com.conciliador.consulta.apresentacao;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.com.conciliador.cadastro.negocio.BandeiraNgc;
import br.com.conciliador.cadastro.negocio.EstLojaNgc;
import br.com.conciliador.cadastro.negocio.FatoNgc;
import br.com.conciliador.cadastro.negocio.ProdutoNgc;
import br.com.conciliador.cadastro.negocio.StatusNgc;
import br.com.conciliador.cadastro.vo.BandeiraVo;
import br.com.conciliador.cadastro.vo.EstLojaVo;
import br.com.conciliador.cadastro.vo.FatoVo;
import br.com.conciliador.cadastro.vo.ProdutoVo;
import br.com.conciliador.cadastro.vo.StatusVo;
import br.com.conciliador.cadastro.vo.filtro.FiltroFatoVo;
import br.com.conciliador.consulta.vo.ResultadoConsultaTicketMedioVo;
import br.com.conciliador.util.jsf.AbstractBean;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Inteiro;
import br.com.r2.util.tipodado.InteiroLongo;
import br.com.r2.util.tipodado.Moeda;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;

public class ConsultaTicketMedioBean extends AbstractBean<FatoVo, FatoNgc>
{

   private List<EstLojaVo> listaEstLojas;
   
   private List<BandeiraVo> listaBandeiras;

   private List<ProdutoVo> listaProdutos;

   private List<ResultadoConsultaTicketMedioVo> resultado;

   private Moeda valorTotalVendas;

   private Moeda valorTotalTicketMedio;

   private Inteiro quantidadeTotalVendas;
   
   public ConsultaTicketMedioBean()
   {
      super(FatoNgc.getInstancia());
      this.ACTION_SEARCH = "consultaTicketMedio";
      this.pageTitle = "titulo_consulta_ticket_medio";
   }

   @Override
   protected void setListaPesquisa() throws R2Exception
   {
      setarListaEstLojas();
      setarListaBandeiras();
   }

   @Override
   public String preparaPesquisar()
   {

      String retorno = super.preparaPesquisar();
      this.getSearchObject().setFiltro(new FiltroFatoVo());
      this.getSearchObject().setBandeiraVo(new BandeiraVo());
      this.getSearchObject().setProdutoVo(new ProdutoVo());
      
      Data filtroData = new Data(new Date());
      this.getSearchObject().getFiltro().setDataVendaFinal(filtroData);
      filtroData = new Data(new Date());
      filtroData.add(GregorianCalendar.DAY_OF_WEEK_IN_MONTH, -1);
      this.getSearchObject().getFiltro().setDataVendaInicial(filtroData);

      return retorno;
   }
   
   @Override
   protected void validarPesquisar() throws R2Exception
   {
      if (this.getSearchObject().getFiltro() == null)
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }
      
      if (this.getSearchObject().getFiltro().getDataVendaInicial() == null
          || !this.getSearchObject().getFiltro().getDataVendaInicial().isPreenchido())
      {
         throw new R2Exception("campo_periodo_obrigatorio");
      }

   }

   private void setarListaEstLojas() throws R2Exception
   {
       this.listaEstLojas = new ArrayList<EstLojaVo>();
       EstLojaVo estLojaVo = new EstLojaVo();
       List<EstLojaVo> lista = EstLojaNgc.getInstancia().pesquisar(estLojaVo, 0);
       
       EstLojaVo vazio = new EstLojaVo();
       vazio.setDescricao(new Texto("TODAS"));
       
       this.listaEstLojas.add(vazio);
       this.listaEstLojas.addAll(lista);
   }

   private void setarListaBandeiras() throws R2Exception
   {
      this.listaBandeiras = new ArrayList<BandeiraVo>();
      BandeiraVo bandeiraVo = new BandeiraVo();
      bandeiraVo.setFlagAtivo(new Flag(YesNo.YES));
      List<BandeiraVo> lista = BandeiraNgc.getInstancia().pesquisar(bandeiraVo,0);

      BandeiraVo vazio = new BandeiraVo();
      vazio.setDescricao(new Texto("TODAS"));

      this.listaBandeiras.add(vazio);
      this.listaBandeiras.addAll(lista);
   }
   
   public void setarListaProdutos(ActionEvent event) throws R2Exception
   {
      if (this.getSearchObject().getBandeiraVo() != null && this.getSearchObject().getBandeiraVo().getCodigo() != null && this.getSearchObject().getBandeiraVo().getCodigo().isPreenchido())
      {
         ProdutoVo produtoVo = new ProdutoVo();
         BandeiraVo bandeiraVo = new BandeiraVo();
         bandeiraVo.setCodigo(this.getSearchObject().getBandeiraVo().getCodigo());
         produtoVo.setBandeiraVo(bandeiraVo);
         produtoVo.setFlagAtivo(new Flag(YesNo.YES));
         int join = ProdutoNgc.JOIN_BANDEIRA;
         List<ProdutoVo> lista = ProdutoNgc.getInstancia().pesquisar(produtoVo, join);
         
         produtoVo = new ProdutoVo();
         produtoVo.setDescricao(new Texto("TODOS"));
         this.setListaProdutos(new ArrayList<ProdutoVo>());
         this.getListaProdutos().add(produtoVo);
         if (lista != null)
         {
            this.getListaProdutos().addAll(lista);
         }
      }
   }
   
   @Override
   protected int getJoinPesquisar()
   {
      int join = FatoNgc.JOIN_DATAVENDA
                 | FatoNgc.JOIN_BANDEIRA
                 | FatoNgc.JOIN_PRODUTO
                 | FatoNgc.JOIN_LOJA
                 | FatoNgc.JOIN_ESTLOJA;
      return join;
   }
   
   @Override
   protected void completarPesquisar() throws R2Exception
   {
      // PEGANDO SOMENTE OS REGISTROS COM PARCELA IGUAL A 1 - INICIO
      this.getSearchObject().setParcela(new Inteiro(1));
      // PEGANDO SOMENTE OS REGISTROS COM PARCELA IGUAL A 1 - FIM
      
      // PEGANDO SOMENTE OS REGISTROS CONFIRMADOS - INICIO
      List<StatusVo> listaStatus = new ArrayList<StatusVo>();
      StatusVo statusVo = new StatusVo();
      
      statusVo.setCodigo(new InteiroLongo(StatusNgc.ST_PREVISTO)); 
      listaStatus.add(statusVo);
      
      statusVo = new StatusVo();
      statusVo.setCodigo(new InteiroLongo(StatusNgc.ST_CONFIRMADO)); 
      listaStatus.add(statusVo);

      statusVo = new StatusVo();
      statusVo.setCodigo(new InteiroLongo(StatusNgc.ST_LIQUIDADO)); 
      listaStatus.add(statusVo);
      
      statusVo = new StatusVo();
      statusVo.setCodigo(new InteiroLongo(StatusNgc.ST_ANTECIPADO)); 
      listaStatus.add(statusVo);
      
      this.getSearchObject().getFiltro().setListaStatus(listaStatus);
      // PEGANDO SOMENTE OS REGISTROS CONFIRMADOS - FIM
   }
   
   public void pesquisar(ActionEvent event)
   {
      try
      {
         double valorVenda = 0;
         double valorTicketMedio = 0;
         int qtdeVendas = 0;
         this.validarPesquisar();
         this.completarPesquisar();
         
         resultado = this.getBusiness().consultarTicketMedio(this.getSearchObject(),this.getJoinPesquisar());
         if (this.resultado != null && this.resultado.size() > 0)
         {
            Iterator<ResultadoConsultaTicketMedioVo> iterator = this.getResultado().iterator();
            while (iterator.hasNext())
            {
               ResultadoConsultaTicketMedioVo element = (ResultadoConsultaTicketMedioVo) iterator.next();
               qtdeVendas += element.getQuantidadeVendas().getValor();
               valorVenda += element.getValorVendas().getValor();
               valorTicketMedio += element.getValorTicketMedio().getValor();
            }
         }

         valorTotalVendas = new Moeda(valorVenda);
         valorTotalTicketMedio = new Moeda(valorTicketMedio);
         quantidadeTotalVendas = new Inteiro(qtdeVendas);
      }
      catch (R2Exception e)
      {
         FacesMessage message = new FacesMessage(e.getMensagem());
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         FacesContext.getCurrentInstance().addMessage("", message);
      }
   }

   public List<EstLojaVo> getListaEstLojas()
   {
      return listaEstLojas;
   }

   public void setListaEstLojas(List<EstLojaVo> listaEstLojas)
   {
      this.listaEstLojas = listaEstLojas;
   }

   public List<BandeiraVo> getListaBandeiras()
   {
      return listaBandeiras;
   }

   public void setListaBandeiras(List<BandeiraVo> listaBandeiras)
   {
      this.listaBandeiras = listaBandeiras;
   }

   public List<ProdutoVo> getListaProdutos()
   {
      return listaProdutos;
   }

   public void setListaProdutos(List<ProdutoVo> listaProdutos)
   {
      this.listaProdutos = listaProdutos;
   }

   public Moeda getValorTotalVendas()
   {
      return valorTotalVendas;
   }

   public void setValorTotalVendas(Moeda valorTotal)
   {
      this.valorTotalVendas = valorTotal;
   }

   public List<ResultadoConsultaTicketMedioVo> getResultado()
   {
      return resultado;
   }

   public void setResultado(List<ResultadoConsultaTicketMedioVo> resultado)
   {
      this.resultado = resultado;
   }

   public Moeda getValorTotalTicketMedio()
   {
      return valorTotalTicketMedio;
   }

   public void setValorTotalTicketMedio(Moeda valorTotalTicketMedio)
   {
      this.valorTotalTicketMedio = valorTotalTicketMedio;
   }

   public Inteiro getQuantidadeTotalVendas()
   {
      return quantidadeTotalVendas;
   }

   public void setQuantidadeTotalVendas(Inteiro quantidadeTotalVendas)
   {
      this.quantidadeTotalVendas = quantidadeTotalVendas;
   }
   
}
